package top.frsf.object;

import java.awt.*;
import java.util.HashMap;
import java.util.Map;


/**
 * 支持多套动画的游戏对象基类
 *
 * @author FRSF
 * @since 2025/8/1 17:00
 */
public abstract class AnimatedGameObject extends GameObject {
    /**
     * 动画帧集合，支持多套动画
     */
    protected Map<String, Image[]> animationSets = new HashMap<>();
    /**
     * 当前动画帧集合
     */
    protected Image[] animationFrames;
    /**
     * 当前帧索引
     */
    protected int currentFrame = 0;
    /**
     * 每帧间隔时间（毫秒）
     */
    protected long frameInterval = 100;
    /**
     * 上一次播放动画的时间（毫秒）
     */
    protected long lastFrameTime = 0;
    /**
     * 动画是否启用
     */
    protected boolean animationEnabled = false;
    /**
     * 标记是否循环播放
     */
    protected boolean loopAnimation = true;
    /**
     * 标记一次性动画是否播放完成
     */
    protected boolean animationFinished = false;
    /**
     * 当前动画名称
     */
    protected String currentAnimationName = "";

    /**
     * 构造函数
     *
     * @param img    图片路径
     * @param x      x坐标
     * @param y      y坐标
     * @param width  宽度
     * @param height 高度
     */
    public AnimatedGameObject(String img, int x, int y, int width, int height) {
        super(img, x, y, width, height);
    }

    /**
     * 添加动画帧集合
     *
     * @param name   动画名称
     * @param frames 动画帧数组
     */
    public void addAnimation(String name, Image[] frames) {
        if (name == null || frames == null || frames.length == 0) {
            throw new IllegalArgumentException("Animation name and frames cannot be null or empty.");
        }
        animationSets.put(name, frames);
    }


    /**
     * 切换到指定动画
     *
     * @param name 动画名称
     * @param loop 是否循环播放
     */
    public void switchAnimation(String name, boolean loop) {
        Image[] frames = animationSets.get(name);
        if (frames == null) {
            throw new IllegalArgumentException("Animation '" + name + "' not found.");
        }

        // 只有在动画确实改变时才重置
        if (!name.equals(currentAnimationName)) {
            this.animationFrames = frames;
            this.currentAnimationName = name;
            this.loopAnimation = loop;
            this.currentFrame = 0;
            this.animationFinished = false;
            this.lastFrameTime = System.currentTimeMillis();
            this.animationEnabled = true;

            // 设置第一帧
            if (frames.length > 0) {
                setImg(frames[0]);
            }
        }
    }

    /**
     * 切换到指定动画并设置帧间隔
     *
     * @param name     动画名称
     * @param interval 帧间隔时间
     * @param loop     是否循环播放
     */
    public void switchAnimation(String name, long interval, boolean loop) {
        switchAnimation(name, loop);
        this.frameInterval = interval;
    }


    @Override
    public void paintSelfImage(Graphics g) {
        super.paintSelfImage(g);
        updateAnimation();      // 更新动画
    }

    /**
     * 更新动画帧
     */
    protected void updateAnimation() {
        if (!animationEnabled || animationFrames == null || animationFrames.length <= 1) {
            return;
        }

        // 如果是一次性动画且已经播放完成，则保持最后一帧
        if (!loopAnimation && animationFinished) {
            return;
        }

        long currentTime = System.currentTimeMillis();
        if (currentTime - lastFrameTime >= frameInterval) {
            // 循环播放
            if (loopAnimation) {
                currentFrame = (currentFrame + 1) % animationFrames.length;
            }
            // 一次性播放
            else {
                if (currentFrame < animationFrames.length - 1) {
                    currentFrame++;
                } else {
                    animationFinished = true;
                }
            }

            setImg(animationFrames[currentFrame]);
            lastFrameTime = currentTime;
        }
    }
}